<script>
/**
 * App.vue - 应用程序主组件
 * 
 * 负责应用程序的初始化、权限管理和基础数据设置
 * 包含权限检查、目录创建和管理员账户初始化等功能
 */
import { readJsonFromFile, writeJsonToFile } from '@/utils/fileUtil'

export default {
  /**
   * 组件数据
   * 包含应用程序运行所需的基础配置和状态
   */
  data() {
    return {
      // 权限状态标志，表示是否已获得存储权限
      permissionGranted: false,
      
      // 存储目录配置
      storageDirectories: {
        base: '/sdcard/test',           // 基础存储目录
        user: '/sdcard/test/user.json'  // 用户数据文件路径
      },
      
      // 默认管理员账户信息
      defaultAdmin: {
        name: 'sysadmin',    // 管理员用户名
        password: '123456',  // 管理员密码
        role: 'admin'        // 管理员角色
      }
    }
  },
  
  /**
   * 应用程序启动时执行
   * 在整个应用程序生命周期内只执行一次
   */
  onLaunch: function () {
    console.log('App Launch')
    // 检查并请求必要的权限
    this.checkAndRequestPermissions()
  },
  
  /**
   * 应用程序显示时执行
   * 每次应用从后台切换到前台时都会执行
   */
  onShow() {
    console.log('App Show')
    
    // 如果已获得权限，则创建目录并初始化管理员账户
    if (this.permissionGranted) {
      this.initializeApplication()
    } else {
      // 再次检查权限，确保权限已授予
      this.checkAndRequestPermissions()
    }
  },
  
  /**
   * 应用程序隐藏时执行
   * 当应用切换到后台时执行
   */
  onHide: function () {
    console.log('App Hide')
  },
  
  methods: {
    /**
     * 初始化应用程序
     * 
     * 在权限获取成功后执行，负责创建必要的目录结构和初始化管理员账户
     * 这是应用程序正常运行的基础准备工作
     */
    initializeApplication() {
      // 创建必要的目录
      this.createNecessaryDirectories()
      // 初始化系统管理员账户
      this.initializeAdminAccount()
    },
    
    /**
     * 检查并请求必要的权限
     * 
     * 根据不同平台环境检查和请求存储权限
     * 对于Android平台，会请求读写外部存储的权限
     * 对于其他平台，默认视为已获得权限
     */
    checkAndRequestPermissions() {
      // 仅在Android平台执行
      // #ifdef APP-PLUS
      if (uni.getSystemInfoSync().platform === 'android') {
        // 定义需要的权限列表
        const permissions = [
          'android.permission.READ_EXTERNAL_STORAGE',   // 读取外部存储权限
          'android.permission.WRITE_EXTERNAL_STORAGE'   // 写入外部存储权限
        ]
        
        // 请求权限
        this.requestPermissions(permissions)
      } else {
        // 非Android平台默认已授权
        this.permissionGranted = true
        this.initializeApplication()
      }
      // #endif
      
      // #ifndef APP-PLUS
      // 非APP环境默认已授权
      this.permissionGranted = true
      this.initializeApplication()
      // #endif
    },
    
    /**
     * 请求权限
     * 
     * 使用plus.android.requestPermissions方法请求指定的权限
     * 根据用户的响应处理不同的权限状态
     * 
     * @param {Array} permissions - 需要请求的权限列表
     */
    requestPermissions(permissions) {
      plus.android.requestPermissions(
        permissions,
        (e) => {
          // 检查是否有被拒绝的权限
          if (e.deniedPresent.length > 0) {
            // 用户暂时拒绝了权限
            this.handlePermissionDenied('暂时')
          } else if (e.deniedAlways.length > 0) {
            // 用户永久拒绝了权限
            this.handlePermissionDenied('永久')
          } else {
            // 权限已全部允许，设置权限状态并初始化应用
            this.permissionGranted = true
            this.initializeApplication()
          }
        },
        (e) => {
          // 权限请求过程中出现错误
          console.error('申请权限失败：', e)
          this.showToast('权限申请失败，应用可能无法正常工作')
        }
      )
    },
    
    /**
     * 处理权限被拒绝的情况
     * 
     * 根据拒绝类型显示不同的提示信息，并提供前往设置的选项
     * 
     * @param {String} type - 拒绝类型：'暂时'或'永久'
     */
    handlePermissionDenied(type) {
      // 根据拒绝类型设置不同的提示信息
      const message = type === '永久' 
        ? '您已永久拒绝存储权限，需要手动前往设置开启权限才能正常使用应用'
        : '需要存储权限才能正常使用应用，是否前往设置开启权限？'
      
      // 显示提示对话框
      uni.showModal({
        title: '权限提示',
        content: message,
        confirmText: '去设置',
        cancelText: '取消',
        success: (res) => {
          if (res.confirm) {
            // 用户点击确认，跳转到应用设置页面
            this.gotoAppPermissionSetting()
          }
        }
      })
    },
    
    /**
     * 显示提示信息
     * 
     * 封装uni.showToast方法，提供统一的提示样式
     * 
     * @param {String} message - 提示信息
     * @param {String} icon - 图标类型，默认为'none'
     */
    showToast(message, icon = 'none') {
      uni.showToast({
        title: message,
        icon: icon
      })
    },
    
    /**
     * 跳转到应用权限设置页
     * 
     * 使用Android原生Intent跳转到应用的权限设置页面
     * 仅在Android平台有效
     */
    gotoAppPermissionSetting() {
      // #ifdef APP-PLUS
      if (uni.getSystemInfoSync().platform === 'android') {
        try {
          // 导入所需的Android类
          const Intent = plus.android.importClass('android.content.Intent')
          const Settings = plus.android.importClass('android.provider.Settings')
          const Uri = plus.android.importClass('android.net.Uri')
          const mainActivity = plus.android.runtimeMainActivity()
          
          // 创建Intent对象
          const intent = new Intent()
          
          // 设置Intent动作为应用详情设置
          intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
          // 创建包含应用包名的Uri
          const uri = Uri.fromParts('package', mainActivity.getPackageName(), null)
          // 设置Intent数据
          intent.setData(uri)
          // 启动Activity
          mainActivity.startActivity(intent)
        } catch (error) {
          // 跳转失败处理
          console.error('跳转设置页面失败：', error)
          this.showToast('跳转设置页面失败，请手动前往设置开启权限')
        }
      }
      // #endif
    },
    
    /**
     * 创建必要的目录
     * 
     * 检查并创建应用所需的存储目录
     * 
     * @returns {Boolean} 是否创建成功
     */
    createNecessaryDirectories() {
      // #ifdef APP-PLUS
      if (uni.getSystemInfoSync().platform === 'android') {
        try {
          // 导入File类
          const File = plus.android.importClass('java.io.File')
          // 创建目录对象
          const dir = new File(this.storageDirectories.base)
          
          // 检查目录是否存在，不存在则创建
          if (!dir.exists()) {
            const success = dir.mkdirs()
            console.log('创建目录结果：', success ? '成功' : '失败')
            return success
          }
          return true
        } catch (error) {
          // 创建目录失败处理
          console.error('创建目录失败：', error)
          return false
        }
      }
      // #endif
      return true
    },
    
    /**
     * 初始化系统管理员账户
     * 
     * 检查并确保系统中存在管理员账户
     * 如果不存在则创建默认的管理员账户
     */
    initializeAdminAccount() {
      try {
        // 读取用户文件
        const users = readJsonFromFile(this.storageDirectories.user)
        
        // 如果文件不存在或内容为空，则创建初始文件
        if (!users || !Array.isArray(users) || users.length === 0) {
          // 创建新的管理员账户文件
          this.createAdminAccount()
        } else {
          // 判断是否有 sysadmin 账户
          const hasSysAdmin = users.some((user) => user.name === this.defaultAdmin.name)
          if (!hasSysAdmin) {
            // 如果没有，则添加管理员账户
            this.addAdminAccount()
          }
        }
      } catch (e) {
        // 初始化过程中出错处理
        console.error("初始化系统管理员账户时出错:", e)
        // 出错时尝试创建新文件
        this.createAdminAccount()
      }
    },
    
    /**
     * 创建管理员账户（新文件）
     * 
     * 创建包含默认管理员账户的新用户文件
     * 用于初始化或重置用户数据
     */
    createAdminAccount() {
      // 创建包含默认管理员的数组
      const initialData = [{ ...this.defaultAdmin }]
      // 写入文件
      const success = writeJsonToFile(initialData, this.storageDirectories.user)
      
      // 记录操作结果
      if (success) {
        console.log("创建了初始管理员账户")
      } else {
        console.error("创建初始管理员账户失败")
      }
    },
    
    /**
     * 添加管理员账户（已有文件）
     * 
     * 向现有用户文件中添加管理员账户
     * 在检测到没有管理员账户时调用
     */
    addAdminAccount() {
      // 向现有文件添加管理员账户
      const success = writeJsonToFile(
        { ...this.defaultAdmin }, 
        this.storageDirectories.user
      )
      
      // 记录操作结果
      if (success) {
        console.log("添加了管理员账户")
      } else {
        console.error("添加管理员账户失败")
      }
    }
  }
}
</script>

<style lang="scss">
/**
 * 全局样式
 * 应用于所有页面的公共CSS样式
 */
.uni-pagination {
  .uni-pagination__num-tag {
    &.page--active {
      background-color: #409eff !important;
      color: #fff !important;
      border-color: #409eff !important;
      font-weight: bold;
    }
  }
}
</style>
